﻿using System;
using System.Windows.Forms;
using FBWMS.Properties;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

namespace FBWMS
{
    public partial class F_COM_DBBackUp : Form
    {
        private G_CommonClassSQLServer G_CommonClassSQLServer = null;

        ////////////////////////////////////////////////////////////////////////////
        //
        //初期処理
        //
        ////////////////////////////////////////////////////////////////////////////
        public F_COM_DBBackUp()
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.F_COM_DBBackUp, "F_COM_DBBackUp");

                //初期処理
                InitializeComponent();                

                if (G_CommonDefine.G_DBServer != "")
                {
                    this.txt_SQLServerName.Text = G_CommonDefine.G_DBServer;
                    this.txt_UserName.Text = G_CommonDefine.G_DBUser;
                    this.txt_Password.Text = G_CommonDefine.G_DBPass;

                    this.grp_Database.Enabled = false;
                    this.grp_Actions.Enabled = false;
                    this.chk_UseWindowsAuthentication.Checked = true;

                    //接続処理
                    this.P_Connect();

                    //DB接続処理
                    this.P_Refresh();
                }

                this.txt_BackUpPath.Text = G_CommonDefine.G_DBBackUp;

                //ToolTipの設定
                G_CommonDefine.G_tt_ToolTip.RemoveAll();
                G_CommonDefine.G_tt_ToolTip.SetToolTip(this.btn_Backup, "F5");
                G_CommonDefine.G_tt_ToolTip.SetToolTip(this.btn_Clear, "F11");

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.FCOMDBBackUp初期処理終了, "F_COM_DBBackUp");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.FCOMDBBackUp初期処理エラー + err.Message, "F_COM_DBBackUp");

                //エラーメッセージ表示
                MessageBox.Show(Resources.FCOMDBBackUp初期処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //フォームアクティブ時処理
        //
        ////////////////////////////////////////////////////////////////////////////       
        private void F_COM_DBBackUp_Activated(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.F_COM_DBBackUp_Activated, "F_COM_DBBackUp_Activated");

                if (G_CommonDefine.G_DBServer != "")
                {
                    this.btn_Backup.Focus();
                }
                else
                {
                    this.txt_SQLServerName.Focus();
                }

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.FCOMDBBackUpActivated処理終了, "F_COM_DBBackUp_Activated");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.FCOMDBBackUpActivated処理エラー + err.Message, "F_COM_DBBackUp_Activated");

                //エラーメッセージ表示
                MessageBox.Show(Resources.FCOMDBBackUpActivated処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }          

        ////////////////////////////////////////////////////////////////////////////
        //
        //接続処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void P_Connect()
        {
            //SQLServerに接続
            this.G_CommonClassSQLServer = new G_CommonClassSQLServer(this.txt_SQLServerName.Text, this.txt_UserName.Text, this.txt_Password.Text, this.chk_UseWindowsAuthentication.Checked);
            this.G_CommonClassSQLServer.G_SQLServer_Connect();

            if (this.G_CommonClassSQLServer.Server != null)
            {
                this.G_CommonClassSQLServer.BackupPercentCompleteChanging += Backup_PercentCompleteChanging;
                this.G_CommonClassSQLServer.BackupComplete += Backup_Complete;
                this.G_CommonClassSQLServer.RestorePercentCompleteChanging += Restore_PercentCompleteChanging;
                this.G_CommonClassSQLServer.RestoreComplete += Restore_Complete;

                this.cmb_Database.DataSource = this.G_CommonClassSQLServer.GetDatabaseNameList();
                this.cmb_Database.Focus();

                this.grp_Server.Enabled = false;
                this.grp_Database.Enabled = true;
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //DB接続処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void P_Refresh()
        {
            if (this.cmb_Database.SelectedIndex >= 0)
            {
                Database db = this.G_CommonClassSQLServer.Server.Databases[this.cmb_Database.SelectedValue.ToString()];

                if (db == null)
                {
                    return;
                }

                this.grp_Actions.Enabled = true;
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //チェックボックスチェック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void chk_UseWindowsAuthentication_CheckedChanged(object sender, EventArgs e)
        {       
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Chk_UseWindowsAuthentication_CheckedChanged, "chk_UseWindowsAuthentication_CheckedChanged");

                this.txt_UserName.Enabled = !this.chk_UseWindowsAuthentication.Checked;
                this.txt_Password.Enabled = !this.chk_UseWindowsAuthentication.Checked;

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.ChkUseWindowsAuthenticationCheckedChanged処理終了, "chk_UseWindowsAuthentication_CheckedChanged");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.ChkUseWindowsAuthenticationCheckedChanged処理エラー + err.Message, "chk_UseWindowsAuthentication_CheckedChanged");

                //エラーメッセージ表示
                MessageBox.Show(Resources.ChkUseWindowsAuthenticationCheckedChanged処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }            
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //接続釦クリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Connect_Click(object sender, EventArgs e)
        {
            try
            {
                //空白チェック
                if (this.txt_SQLServerName.Text.Length == 0)
                {
                    MessageBox.Show(Resources.サーハー名を入力してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.txt_SQLServerName.Focus();
                    return;
                }

                //ログインユーザーチェック
                if (!this.chk_UseWindowsAuthentication.Checked)
                {
                    if (this.txt_UserName.Text.Length == 0)
                    {
                        MessageBox.Show(Resources.ユーサー名を入力してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.txt_UserName.Focus();
                        return;
                    }
                    else if (this.txt_Password.Text.Length == 0)
                    {
                        MessageBox.Show(Resources.ハスワートを入力してくたさい, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.txt_Password.Focus();
                        return;
                    }                    
                }

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Connect_Click, "btn_Connect_Click");

                //接続処理
                this.P_Connect();

                this.cmb_Database.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnConnectClick処理終了, "btn_Connect_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnConnectClick処理エラー + err.Message, "btn_Connect_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnConnectClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);

                this.grp_Database.Enabled = false;
                this.grp_Actions.Enabled = false;
            }         
        }        

        ////////////////////////////////////////////////////////////////////////////
        //
        //DBコンボボックス選択時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void cmb_Database_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Cmb_Database_SelectedIndexChanged, "cmb_Database_SelectedIndexChanged");

                //DB接続処理
                this.P_Refresh();

                this.txt_BackUpPath.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.CmbDatabaseSelectedIndexChanged処理終了, "cmb_Database_SelectedIndexChanged");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.CmbDatabaseSelectedIndexChanged処理エラー + err.Message, "cmb_Database_SelectedIndexChanged");

                //エラーメッセージ表示
                MessageBox.Show(Resources.CmbDatabaseSelectedIndexChanged処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //クリア釦クリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Clear_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.Btn_Clear_Click, "btn_Clear_Click");

                this.txt_SQLServerName.Text = string.Empty;
                this.chk_UseWindowsAuthentication.Checked = false;
                this.txt_UserName.Text = string.Empty;
                this.txt_Password.Text = string.Empty;                
                this.txt_BackUpPath.Text = string.Empty;

                this.grp_Database.Enabled = false;
                this.grp_Actions.Enabled = false;
                this.grp_Server.Enabled = true;

                this.txt_SQLServerName.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnClearClick処理終了, "btn_Clear_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnClearClick処理エラー + err.Message, "btn_Clear_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnClearClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region BackUp系処理 ***************************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //バックアップボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Backup_Click(object sender, EventArgs e)
        {
            try
            {
                //空白チェック
                if (this.txt_BackUpPath.Text.Length == 0)
                {
                    MessageBox.Show(Resources.Btn_Backup_Click, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.txt_BackUpPath.Focus();
                    return;
                }

                if (DialogResult.Cancel == MessageBox.Show(Resources.ハックアッフ処理を実行しますよろしいてすか, Resources.確認, MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                {
                    return;
                }

                this.btn_Backup.Enabled = false;
                this.btn_Backup.Text = Resources.処理実行中;
                this.Refresh();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, Resources.BtnBackupClick処理開始, "btn_Backup_Click");

                pbDBAction.Maximum = 100;
                pbDBAction.Style = ProgressBarStyle.Blocks;
                pbDBAction.Value = 0;
                pbDBAction.Step = 10;

                string databaseName = this.cmb_Database.SelectedValue.ToString();

                string backUpPath = this.txt_BackUpPath.Text + DateTime.Now.ToString("yyMMdd_HHmmss") + this.cmb_Database.SelectedValue.ToString() + Resources.BackUpPath;

                //DBバックアップ処理実行
                this.G_CommonClassSQLServer.G_SQLServer_BackUp(databaseName, backUpPath);

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, Resources.BtnBackupClick処理終了, "btn_Backup_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, Resources.BtnBackupClick処理エラー + err.Message, "btn_Backup_Click");

                //エラーメッセージ表示
                MessageBox.Show(Resources.BtnBackupClick処理エラー + err.Message, Resources.エラー, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.btn_Backup.Text = Resources.ハックアッフ;
                this.btn_Backup.Enabled = true;
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //バックアップ終了時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        public void Backup_Complete(object sender, ServerMessageEventArgs e)
        {
            pbDBAction.Value = pbDBAction.Maximum;
            string databaseName = ((Backup)sender).Database;
            string msg = string.Format(Resources.Msg, databaseName);
            MessageBox.Show(msg);
            pbDBAction.Value = 0;
        }

        public void Backup_PercentCompleteChanging(object sender, PercentCompleteEventArgs e)
        {
            pbDBAction.PerformStep();
        }

        #endregion *************************************************************************

        #region Restore系処理(現在未使用) **************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //Restoreボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btnRestore_Click(object sender, EventArgs e)
        {
            pbDBAction.Maximum = 100;
            pbDBAction.Style = ProgressBarStyle.Blocks;
            pbDBAction.Value = 0;
            pbDBAction.Step = 10;
            string databaseName = cmb_Database.SelectedValue.ToString();
            G_CommonClassSQLServer.G_SQLServer_Restore(databaseName);
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //Restore終了時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        public void Restore_Complete(object sender, ServerMessageEventArgs e)
        {
            pbDBAction.Value = pbDBAction.Maximum;
            string databaseName = ((Restore)sender).Database;
            string msg = string.Format("Database {0} has been restored successfully!", databaseName);
            MessageBox.Show(msg);
            pbDBAction.Value = 0;
        }

        public void Restore_PercentCompleteChanging(object sender, PercentCompleteEventArgs e)
        {
            pbDBAction.PerformStep();
        }

        #endregion *************************************************************************

        #region フォーム共通処理 ***********************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //ショートカットキー処理
        //
        ////////////////////////////////////////////////////////////////////////////
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (this.cc_ShortcutKeyHelper1.PerformClickByKeys(keyData))
            {
                return true;
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        ////////////////////////////////////////////////////////////////////////////
        //フォームKeyDown時処理
        //(エンターを押した際に次のコントロールに移動する。)
        //(フォームの『KeyPreview』を『true』にすること)
        ////////////////////////////////////////////////////////////////////////////
        private void F_COM_DBBackUp_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!e.Control)
                {
                    this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
                }
            }
        }

        #endregion *************************************************************************
    }
}